/*
1. 客户端将用户名、密码以 POST 请求方式发送到服务端；
2. 服务端获取请求，将用户名和密码放到数据库用户集合中进行查询操作；
3. 如果查询到对应文档，则用户密码输入正确，生成授权码，将授权信息存在数据库授权集合中，并且返回响应。
4. 如果查询不到对应文档，则用户密码输出错误，返回响应。
5. 客户端根据响应在页面输出提示或进行页面跳转。
*/

const User = require('../model/user.js');
const Token = require('../model/tokens.js');
const random = require('string-random');

async function Login(ctx) {
	let username = ctx.request.body.username;
	let password = ctx.request.body.password;

	var result = {
		errCode: 0
	}

	let user = await User.findOne({
		username: username,
		password: password
	});

	if (user) {
		//成功
		//1.生成一个随机token、登录时间、过期时间
		let tokenid = random(16);
		let gettime = Date.now();
		let overtime = Date.now() + 1000 * 60 * 60 * 24;

		//2.判断当前用户是否已经存在token
		let tokeninfo = await Token.findOne({
			username: username
		});

		if (tokeninfo) {
			//存在（修改token）			
			//try{}catch{}	try{}表示尝试做某件事，如果失败了就用catch{}捕获同时忽略try{}中的错误，也就是说只执行catch{}中的代码，如果成功了则catch{}就不执行了。
			try {
				await Token.update({
					username: username
				}, {
					tokenid,
					gettime,
					overtime
				})
			} catch (e) {
				result.errCode = 3;
				result.errMsg = "令牌更新失败";
				ctx.body = result;
			}

		} else {
			//不存在（新建token）
			//新建一个用于保存的token对象
			try {
				await new Token({
					username,
					tokenid,
					gettime,
					overtime
				}).save()
			} catch (e) {
				result.errCode = 2;
				result.errMsg = "令牌生成失败";
				ctx.body = result;
			}
		}

		result.errMsg = "令牌已生成";
		result.tokenid = tokenid;
		result.username = username;
		ctx.body = result;
	} else {
		//失败
		result.errCode = 1;
		result.errMsg = "用户名或密码不正确";
		ctx.body = result;
		return;
	}
}

module.exports = Login;
